import axios, { AxiosInstance, InternalAxiosRequestConfig,AxiosResponse } from 'axios';
import CryptoJS from 'crypto-js'
import { showToast } from 'vant';
import { ApiResponse } from './models';


// 创建 axios 实例
const service: AxiosInstance = axios.create({
    // 基本配置
    //baseURL: process.env.VITE_APP_BASE_API, // 你的 API 基础路径
    timeout: 5000, // 请求超时时间
    headers: {
        'Content-Type': 'application/json',
        'X-Requested-With': 'XMLHttpRequest'
        // 添加其他需要的请求头信息
    }
});

// 请求拦截器
service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        // 在发送请求之前做些什么
        // 可以在这里添加 token 等请求头信息
        config.data = {
            ...config.data,
            ftime: Date.now(),
        };

        // 计算 fsign 参数，可以根据具体情况选择合适的签名算法
        const fsign = calculateFsign(config.data);

        // 在请求中添加 fsign 参数
        config.data = {
            ...config.data,
            fsign,
        };

        return config;
    },
    (error) => {
        // 对请求错误做些什么
        console.error('请求发生错误：', error);
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    (response) => {
        const res = response.data;
        // 如果响应中的 code 不为 0，显示错误信息
        if (res.code !== 0) {
            showToast({
                type: 'fail',
                message: res.message || 'Error',
            });
        }
        return res;
    },
    (error) => {
        // 对响应错误做点什么
        console.error('响应发生错误：', error);
        return Promise.reject(error);
    }
);
// 计算 fsign 参数的函数
function calculateFsign(data:any) {
    // 定义密钥，可以根据实际情况替换成你的密钥
    const secretKey = 'your_secret_key';

    // 将请求参数按键名升序排序
    const sortedKeys = Object.keys(data).sort();
    let signString = '';

    // 构建待签名的字符串
    sortedKeys.forEach(key => {
        signString += key + '=' + data[key] + '&';
    });

    // 去除末尾的 "&" 符号
    signString = signString.slice(0, -1);

    // 使用 CryptoJS 计算 HMAC-SHA256 签名
    return CryptoJS.HmacSHA256(signString, secretKey).toString(CryptoJS.enc.Hex);
}



export async function get<T>(url: string): Promise<ApiResponse<T>> {
    try {
        const response: AxiosResponse<ApiResponse<T>> = await service.get<ApiResponse<T>>(url);
        return response.data;
    } catch (error) {
        // 处理错误
        throw new Error('Request failed');
    }
}

// 封装一个 POST 请求示例
export async function post<T>(url: string, data: any): Promise<ApiResponse<T>> {
    try {
        const response: AxiosResponse<ApiResponse<T>> = await service.post<ApiResponse<T>>(url, data);
        return response.data; // 返回接口定义的 data 类型
    } catch (error) {
        // 处理错误
        throw new Error('Request failed');
    }
}




export default service;
